// 程序结构-标识符的定义和使用
package main

import (
	"fmt"
	"os"
)

/*
 * Go语言总是先写标识符再写类型
 * 比如函数返回值就在函数签名尾部
 */
func totalPirce(price float32, number int) float32 {
	return price * float32(number)
}

func main() {
	/*
	 * var name type = expression
	 * type和expression是可以（但不能同时）省略的
	 * 省略type时，Go会从expression自动推断类型
	 * 省略expresion时，Go会初始化变量为零值
	 * 零值：0（数字）、false（布尔）、""（字符串）、nil（接口和引用）
	 */
	var 爱好 string = "我爱Go语言" // 注释符号两侧各有一个空格
	var price float32 = 9.9
	var number int = 2
	fmt.Println("hello,world", 爱好)
	fmt.Printf("买%d本书需要￥%.2f元钱", number, totalPirce(price, number))

	// 一次声明多个变量
	var i, j, k, 中文bian量 int
	fmt.Println(i, j, k, 中文bian量)
	i, j = j, i // 两变量值互换

	// 一次声明不同类型的多个变量
	var b, f, s = true, 2.3, "four"
	fmt.Println(b, f, s)

	// 从函数返回值初始化多个变量
	var file, err = os.Open("./example.txt")
	fmt.Println(file, err)

	// 变量声明简洁格式(使用海象运算符可同时省略var关键字和类型)
	anim := "simple"
	fmt.Println(anim)

	// 使用海象运算符时，如果左侧变量已经声明过，则对该变量起到赋值作用（如下面代码中的err)
	// 使用海象运算符时，必须声明至少一个新变量，否则报错
	newf, err := os.Open("./example.txt")
	fmt.Println(newf)
}
